/*
通常基于分配对象的大小的内存管理算法来使用 malloc 和 free 比如，先分配一个数组保存数据，使用完后再销毁数组。
但是在一些应用程序中，内存的释放操作是同时发生的，图形用户界面就是一个例子。滚动条，按钮等控件的内存在窗口创建时分配，在窗口销毁时被释放。对于此类应用程序来说，基于对象生命周期的内存管理算法通常更好。
简单点就是统一分配，之后再统一释放。

arena 是基于内存池的内存管理接口。先分配一个内存池，从池子中分配内存，当内存不再需要时再全部释放。
**/

#ifndef _ARENA_INCLUDED_
#define _ARENA_INCLUDED_
#include "except.h"


extern const Except_T ex_arena_new_failed;
extern const Except_T ex_arena_alloc_failed;


#define T arena_T
typedef struct T *T;

extern T arena_new();
extern void arena_dispose(T *ap);

extern void* arena_alloc(T arena, long nbytes, const char *file, int line);
extern void* arena_calloc(T arena, long count, long nbytes, const char *file, int line);
extern void arena_free(T arena);

#undef T
#endif // _ARENA_INCLUDED_
